package com.yfqy.app.enums;

import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Getter
public enum OrderStatusMerge {

    /**
     * 待支付（合并：待付款 ）
     */
    PENDING_PAYMENT("待支付", new Byte[]{0}),

    /**
     * 待发货（合并：已付款 + 已出库）
     */
    PENDING_SHIPMENT("待发货", new Byte[]{1, 10}),

    /**
     * 待收货/使用
     */
    PENDING_RECEIPT("待收货/使用", new Byte[]{3}),

    /**
     * 售后
     */
    REFUNDING("售后", new Byte[]{6, 7, 8}),

    /**
     * 已完成（合并：已完成 + 已评价）
     */
    COMPLETED("已完成", new Byte[]{4, 9}),

    /**
     * 已关闭（合并：支付超时 + 已取消）
     */
    CLOSED("已关闭", new Byte[]{2, 5});

    private final String description;
    private final Byte[] originalStatuses;

    OrderStatusMerge(String description, Byte[] originalStatuses) {
        this.description = description;
        this.originalStatuses = originalStatuses;
    }

    public List<Byte> getOriginalStatusList() {
        return Arrays.asList(originalStatuses);
    }

    /**
     * 根据原始状态获取用户端状态
     */
    public static OrderStatusMerge fromOriginalStatus(Byte originalStatus) {
        if (originalStatus == null) {
            return null;
        }
        for (OrderStatusMerge status : values()) {
            for (Byte s : status.originalStatuses) {
                if (s.equals(originalStatus)) {
                    return status;
                }
            }
        }
        return null;
    }

    /**
     * 获取所有原始状态码
     */
    public static List<Byte> getAllOriginalStatuses(OrderStatusMerge userStatus) {
        if (userStatus == null) {
            return Collections.emptyList();
        }
        return Arrays.asList(userStatus.originalStatuses);
    }

    /**
     * 获取多个用户端状态对应的所有原始状态码
     */
    public static List<Byte> getOriginalStatuses(List<OrderStatusMerge> userStatuses) {
        if (userStatuses == null || userStatuses.isEmpty()) {
            return Collections.emptyList();
        }
        return userStatuses.stream()
                .flatMap(status -> Arrays.stream(status.originalStatuses))
                .distinct()
                .collect(Collectors.toList());
    }
}
